package com.chap6;

import lombok.SneakyThrows;

import java.util.concurrent.CountDownLatch;

/**
 * <p>
 * <code>CountDownLatchDemo</code>
 * </p>
 *
 * @author junbao3
 * TODO
 * @date 2023-03-20 4:28
 * Copyright (C) 2021 IFlyTek. All rights reserved.
 */
public class CountDownLatchDemo {
    //裁判 数字归零，就可以唤醒。归零之前，阻塞
    private static CountDownLatch begin = new CountDownLatch(1);

    //玩家
    private static CountDownLatch end = new CountDownLatch(8);

    public static void main(String[] args) throws InterruptedException {
        for (int i = 1; i <=8 ; i++) {
            new Thread(new Runnable() {
                @SneakyThrows
                @Override
                public void run() {
                    System.out.println("参赛者"+Thread.currentThread().getName()+"已经准备好了");
                    begin.await();//1.八个跑步选手在此阻塞
                    System.out.println("参赛者"+Thread.currentThread().getName()+"开始跑步");
                    Thread.sleep(1000);
                    System.out.println("参赛者"+Thread.currentThread().getName()+"到达终点");
                    end.countDown();
                }
            }).start();
        }
        Thread.sleep(5000);
        System.out.println("开始比赛");
        begin.countDown();//2.减1，如果归0，唤醒八个跑步选手
        end.await();//3.八个跑步选手都达到终点
        System.out.println("比赛结束");
    }

/*
参赛者Thread-2已经准备好了
参赛者Thread-1已经准备好了
参赛者Thread-3已经准备好了
参赛者Thread-0已经准备好了
参赛者Thread-5已经准备好了
参赛者Thread-4已经准备好了
参赛者Thread-7已经准备好了
参赛者Thread-6已经准备好了
开始比赛
参赛者Thread-2开始跑步
参赛者Thread-5开始跑步
参赛者Thread-1开始跑步
参赛者Thread-3开始跑步
参赛者Thread-6开始跑步
参赛者Thread-7开始跑步
参赛者Thread-4开始跑步
参赛者Thread-0开始跑步
参赛者Thread-0到达终点
参赛者Thread-6到达终点
参赛者Thread-5到达终点
参赛者Thread-2到达终点
参赛者Thread-4到达终点
参赛者Thread-7到达终点
参赛者Thread-3到达终点
参赛者Thread-1到达终点

*/
}
